#include <iostream>
#include <sstream>
#include <random>
#include <iomanip>
#include <atomic>
#include <set>
using namespace std;

// UUID(UniversallyUniqueIdentifier),也叫通⽤唯⼀识别码，通常由32位16进制数字字符组成。
// UUID的标准型式包含32个16进制数字字符，以连字号分为五段，形式为8-4-4-4-12的32个字符，如：
// 550e8400-e29b-41d4-a716-446655440000。
// 在这⾥，uuid⽣成，我们采⽤⽣成8个随机数字，加上8字节序号，共16字节数组⽣成32位16进制字符
// 的组合形式来确保全局唯⼀的同时能够根据序号来分辨数据（随机数⾁眼分辨起来真是太难了....）。

class Uuid
{
public:
    static std::string uuid()
    {
        // 先生成8位0~255的数字，然后转化为十六位数字，最后输入到结果字符串中
        int seed = std::random_device()();
        std::mt19937 generator(seed);
        std::uniform_int_distribution<size_t> distribution(0, 255);

        std::stringstream ss;
        for (int i = 0; i < 8; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << (distribution(generator));
            if (i == 3 || i == 7 || i == 5)
                ss << "-";
        }

        // 使用静态变量一直累加来作为序号，也是以8个0~255的数字分别以十六位的形式输入到字符流中
        static std::atomic<size_t> seq(0);
        for (int i = 0; i < 8; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << ((seq.load() >> (((7 - i) * 8))) & 0xff);
            // std::cout << std::setw(2) << std::setfill('0') << std::hex << (seq.load() >> (((7 - i) * 4))) << std::endl;
            if (i == 1)
                ss << "-";
        }
        ++seq;

        return ss.str();
    }
};

int main()
{
    for (int i = 0; i < 10000; i++)
    {
        std::cout << Uuid::uuid() << std::endl;
    }

    // std::set<std::string> s;
    // for (int i = 0; i < 10000; i++)
    // {
    //     std::string uuid = Uuid::uuid();
    //     if(s.find(uuid) == s.end())
    //         s.insert(uuid);
    //     else
    //     {
    //         std::cout << "有重复uuid" << std::endl;
    //     }
    // }
    return 0;
}